package com.jeff.base;


import com.jeff.meta.model.SingleNode;

/**
 * {@Description} 翻转单向链表
 * {@Author} <b style="color:yellow">yaojianfeng</b> 2024/7/7 下午8:04
 */
public class ReverseLinkedList {
    public static void main(String[] args) {
        SingleNode<Integer> node1 = new SingleNode<>(1);
        SingleNode<Integer> node2 = new SingleNode<>(2);
        SingleNode<Integer> node3 = new SingleNode<>(3);
        SingleNode<Integer> node4 = new SingleNode<>(4);
        SingleNode<Integer> node5 = new SingleNode<>(5);
        node1.next = node2;
        node2.next = node3;
        node3.next = node4;
        node4.next = node5;

        SingleNode<Integer> singleNode = reverse(node1);
        System.out.println(singleNode.value);
    }

    /**
     * 反转单链表。
     *
     * @param head 单链表的头节点。
     * @return 反转后的链表的头节点。
     */
    public static SingleNode<Integer> reverse(SingleNode<Integer> head) {
        // 初始化前驱节点为null，用于存储反转后的链表的头节点
        SingleNode<Integer> pre = null;
        // 初始化当前节点为头节点，用于遍历链表
        SingleNode<Integer> cur = head;
        // 遍历链表直到当前节点为null，即遍历完整个链表
        while (cur != null) {
            // 临时存储当前节点的下一个节点，防止丢失后续节点信息
            SingleNode<Integer> next = cur.next;
            // 将当前节点的next指向前驱节点，实现链表节点的反转
            cur.next = pre;
            // 移动前驱节点到当前节点，为下一个节点的反转做准备
            pre = cur;
            // 移动当前节点到下一个节点，继续遍历
            cur = next;
        }
        // 返回反转后的链表的头节点，即原链表的尾节点
        return pre;
    }
}
